package cn.cdut.yiwenqian.user.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import com.opensymphony.xwork2.ActionSupport;

/**
 * 所下载文件相关的的几个属性:文件格式 contentType, 获取文件名的方法inputName,
 * 文件内容（显示的）属性contentDisposition, 限定下载文件 缓冲区的值bufferSize
 */
@Namespace("/download")
// @Results({ @Result(name = "success", type = "stream", params = {
// "contentType",
// "application/octet-stream;charset=ISO8859-1", "inputName",
// "inputStream", "contentDisposition",
// "attachment;filename=\"${fileName}\"", "bufferSize", "4096" }) })
public class DownloadAction extends ActionSupport {
	/**
	 * 下载文件的参数名
	 */
	private String fileName;
	/**
	 * 文件名称
	 */
	private String inputName;

	/*
	 * 使用struts2注解方式进行下载，
	 * 其中contentType,inputName,contentDisposition,bufferSize分别代表下载文件类型、
	 * 指定被下载文件的入口输入流、指定下载文件的文件名、指定下载文件时的缓冲大小
	 * 其中params={key1,value1,key2,value2..}，
	 * 下面注解里面的inputName的value值代表getInputStream()方法（潜规则为去掉get前缀、
	 * 首字母小写的字符串即为inputStream）
	 * 如果想在注解里面添加字符串，或者想调用方法并获得返回值，那么需要使用\"${方法名字这里依然遵守潜规则}\"这种形式，比如在"attachment
	 * ;filename=gdc.exe"，可以将gdc.exe替换为\"${方法名}\"通过调用该方法获得下载文件名字
	 * application/octet-stream表示可以下载任何文件
	 */
	@Action(value="toolDownload",results = { @Result(name = "success", type = "stream", params = { "contentType",
			"application/octet-stream;charset=utf-8", "inputName", "inputStream", "contentDisposition",
			"attachment;filename=\"${fileName}\"", "bufferSize", "4096" }) })
	public String toolDownload() {
		return "success";
	}

	public InputStream getInputStream() throws Exception {
		System.out.println("xiazaiziyuandizhi:"+fileName);
		if(fileName!=null){
			return new FileInputStream(fileName);
		}
		return null;
	}

	public String getFileName() throws UnsupportedEncodingException {
		// 针对不同浏览器，处理中文名称乱码问题(非IE/IE)
		final String userAgent = ServletActionContext.getRequest().getHeader("USER-AGENT");
		if (!StringUtils.containsIgnoreCase(userAgent, "MSIE"))
		{
			fileName = new String(fileName.getBytes(), "ISO-8859-1");
		}else
		{
			fileName = URLEncoder.encode(fileName, "utf-8");
		}
		return fileName;
	}

	public void setFileName(String fileName) throws UnsupportedEncodingException {
		this.fileName = fileName;
	}

	/**
	 * @return the inputName
	 */
	public String getInputName() {
		return inputName;
	}

	/**
	 * @param inputName
	 *            the inputName to set
	 */
	public void setInputName(String inputName) {
		this.inputName = inputName;
	}

}
